package com.kk.crowd.mvc.handler;

import com.github.pagehelper.PageInfo;
import com.kk.crowd.constant.CrowdConstant;
import com.kk.crowd.service.api.AdminService;
import com.kk.crowd.entity.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;

@Controller
public class AdminHandler {

    @Autowired
    private AdminService adminService;

    @RequestMapping("remove/admin/{adminId}/{pageNum}/{keyword}.html")
    public String remove(
            @PathVariable("adminId") Integer adminId,
            @PathVariable("pageNum") Integer pageNum,
            @PathVariable("keyword") String keyword
    ) {

        // 执行删除
        adminService.remove (adminId);

        // 页面跳转：回到分页页面

        // 尝试方案1：直接转发到admin-page.jsp会无法显示分页数据
        // return "admin-page";

        // 尝试方案2：转发到/admin/get/page.html地址，一旦刷新页面会重复执行删除浪费性能
        // return "forward:/admin/get/page.html";

        // 重定向到分页页面，使用重定向是为了避免刷新浏览器重复提交表单
        // 注意：多次转发后的重定向记得 起始加/
        return "redirect:/admin/page.html?pageNum=" + pageNum + "&keyword=" + keyword;
    }

    /**
     * 用户修改
     *
     * @param admin
     * @param pageNum
     * @param keyword
     * @return
     */
    @RequestMapping("/edit/admin.html")
    public String editAdmin(Admin admin,
                            @RequestParam(value = "pageNum") Integer pageNum,
                            @RequestParam(value = "keyword") String keyword) {
        // 修改用户
        adminService.update (admin);
        // 重定向到分页页面，使用重定向是为了避免刷新浏览器重复提交表单
        // 注意：多次转发后的重定向记得 起始加/
        return "redirect:/admin/page.html?pageNum=" + pageNum + "&keyword=" + keyword;
    }


    /**
     * 修改用户前回显
     *
     * @param id
     * @param modelMap
     * @return
     */
    @RequestMapping("/admin/to/edit/page.html")
    public String editShowAdmin(@RequestParam(value = "adminId") Integer id, ModelMap modelMap) {
        // 1.根据 id（主键）查询待更新的 Admin 对象
        Admin admin = adminService.getAdminById (id);

        // 2.将 Admin 对象存入模型
        modelMap.addAttribute ("admin", admin);

        return "admin-edit";
    }


    /**
     * 添加用户
     *
     * @param admin
     * @return
     */
    @RequestMapping("/save/admin.html")
    public String saveAdmin(Admin admin) {
        // 执行保存
        adminService.saveAdmin (admin);

        // 重定向到分页页面，使用重定向是为了避免刷新浏览器重复提交表单
        return "redirect:/admin/page.html?pageNum=" + Integer.MAX_VALUE;
    }

    // 分页请求
    @RequestMapping("admin/page.html")
    public String getAdminPage(
            // 注意：页面上有可能不提供关键词，要进行适配
            // 在@RequestParam注解中设置defaultValue属性为空字符串表示
            // 浏览器不提供关键词时，keyword 变量赋值为空字符串
            @RequestParam(value = "keyword", defaultValue = "") String keyword,

            // 浏览器未提供 pageNum 时，默认前往第一页
            @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,

            // 浏览器未提供 pageSize 时，默认每页显示 5 条记录
            @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,

            ModelMap modelMap) {

        // 查询得到分页数据
        PageInfo<Admin> pageInfo = adminService.getAdminPage (keyword, pageNum, pageSize);

        // 将分页数据存入模型
        modelMap.addAttribute (CrowdConstant.ATTR_NAME_PAGE_INFO, pageInfo);

        return "admin-page";
    }

    // 注销
    @RequestMapping("admin/do/logout.html")
    public String output(HttpSession session) {
        // 强制session失效
        session.invalidate ( );

        return "redirect:/admin/to/login/page.html";
    }

    // 登录
    @RequestMapping("admin/do/login.html")
    public String daLogin(
            @RequestParam("loginAcct") String loginAcct,
            @RequestParam("userPswd") String userPswd,
            HttpSession session
    ) {
        // 调用Service方法执行登录检查
        // 这个方法如果能够返回 admin对象说明登录成功，如果账号、密码不正确则抛出异常
        Admin admin = adminService.getAdminByLoginAcct (loginAcct, userPswd);

        // 将登录成功返回的 admin 对象存入 Session 域
        session.setAttribute (CrowdConstant.ATTR_NAME_LOGIN_ADMIN, admin);
        return "redirect:/admin/to/main/page.html";
    }
}
